package ar.uade.distribuidas.tpo.srv.dao;


import java.io.File;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.joda.time.LocalDate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;







import ar.uade.distribuidas.tpo.base.dominiodto.EstadoRemito;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemRemitoCPEDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDeCompraDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ProveedorDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RemitoCPEDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.utils.FormatUtils;
import ar.uade.distribuidas.tpo.srv.delegado.BD;

public class RemitoCPEXmlDAO {
	private static RemitoCPEXmlDAO instancia;
	// private static String ARCHIVO = "remitocpe.xml";
	//private static Document doc;
	BD bd;

	public static RemitoCPEXmlDAO getInstancia() {
		if (instancia == null) {
			instancia = new RemitoCPEXmlDAO();
			//instancia.createDocument(nombreArch);
		}
		return instancia;
	}

	/*private void createDocument(InputStream nombreArchivo) {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(nombreArchivo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
*/
	private RemitoCPEXmlDAO() {
		super();
		bd = BD.getInstance();
	}

	public Set<RemitoCPEDTO> recuperarRemitoCPEDTO(Document docu) {
		Set<RemitoCPEDTO> rcpeList = new HashSet<RemitoCPEDTO>();
		NodeList nodos = docu.getElementsByTagName("RemitoCPE");
		for (int i = 0; i < nodos.getLength(); i++) {
			if (nodos.item(i).hasChildNodes()) {
				rcpeList.add(mapStock((Element) nodos.item(i)));
			}
		}
		return rcpeList;
	}

	private RemitoCPEDTO mapStock(Element eleRemitoCpe) {

		RemitoCPEDTO rcpe = new RemitoCPEDTO();

		try {
			rcpe.setEstado(EstadoRemito.NUEVO);
			rcpe.setNumero(Integer.parseInt(eleRemitoCpe.getAttribute("numero")));
			//DateFormat df = new SimpleDateFormat(FormatUtils.DATE_PATTERN);
			try {
				LocalDate fecha = LocalDate.parse(eleRemitoCpe.getTextContent(),
						FormatUtils.DATE_FORMATTER);
				rcpe.setFecha(fecha.toString(FormatUtils.DATE_FORMATTER));
			} catch (Exception e) {
				rcpe.setFecha(LocalDate.now().toString(FormatUtils.DATE_FORMATTER));
			}

			Long cuil = ((Long.parseLong(eleRemitoCpe
					.getElementsByTagName("Cuil").item(0).getTextContent())));
			// prov.setNombre(elemProv.getAttribute("RazonSocial")); No hace falta
			//  ya que sacamos el proveedor de la DB

			ProveedorDTO pr = null;

			pr = bd.getProveedor(cuil);

			rcpe.setProveedor(pr);

			Element referencia = (Element) eleRemitoCpe.getElementsByTagName(
					"Referencia").item(0);

			NodeList ordencompras = referencia
					.getElementsByTagName("OrdenCompra");
			for (int i = 0; i < ordencompras.getLength(); i++) {

				if (ordencompras.item(i).getNodeType() == Node.ELEMENT_NODE) {
					Element c = (Element) ordencompras.item(i);
					int numero = Integer.parseInt(c
							.getElementsByTagName("Numero").item(0)
							.getTextContent());
					OrdenDeCompraDTO ordenComp = bd.getOrdenCompra(numero); // new
																			// GestionOC().getOC(Integer.valueOf(getValue("Numero",
																			// c)));

					Element rodamiento = (Element) eleRemitoCpe
							.getElementsByTagName("Rodamientos").item(0);
					NodeList items = rodamiento.getElementsByTagName("Item");
					List<ItemRemitoCPEDTO> itemsRem = new ArrayList<ItemRemitoCPEDTO>();

					for (int j = 0; j < items.getLength(); j++) {
						Node item = items.item(j);

						if (item.getNodeType() == Node.ELEMENT_NODE) {
							Element it = (Element) item;

							RodamientoDTO rod = new RodamientoDTO(
									Long.parseLong(it.getAttribute("serie")),
									getValue("Sufijo", it), getValue("Marca",
											it), getValue("Origen", it));

							RodamientoDTO rodT = bd.getRodamiento(rod);
							if(rodT != null){
								ItemRemitoCPEDTO icpe = null;
								icpe = new ItemRemitoCPEDTO();
								icpe.setCantidad((Integer.valueOf(getValue(
										"Cantidad", it))));
								icpe.setRodamiento(rodT);
								icpe.setOrdenCompra(ordenComp);
								icpe.setNumeroRemitoCPE(rcpe.getNumero());
								itemsRem.add(icpe);

							}

						}
						rcpe.setItemOC(itemsRem);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return rcpe;
	}

	private static String getValue(String tag, Element element) {
		NodeList nodes = element.getElementsByTagName(tag).item(0)
				.getChildNodes();
		Node node = (Node) nodes.item(0);
		if (node != null) {
			return node.getNodeValue();
		}
		return "";
	}
	
	public static void main(String[] args) {//C:\\Users\\Maxi\\Workspace2\\rodamientos-web\\
	//	Set<RemitoCPEDTO> sc = RemitoCPEXmlDAO.getInstancia("C:\\Users\\Maxi\\Workspace2\\rodamientos-cpe\\REMITO_3.xml").recuperarRemitoCPEDTO();
		//System.out.println("Esta vacio?: "+ sc.isEmpty());
	}
}